﻿using System;
using Object = UnityEngine.Object;

namespace MLog {
    public interface ILogger {
        string Name { get; set; }
        LogLevel Level { get; set; }

        /// <summary>Logs the specified message at the error level.</summary>
        /// <param name="message">The message.</param>
        void Error(string message);

        /// <summary>Logs the specified message at the error level.</summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Error(string message, params object[] args);

        /// <summary> Logs the specified message at the error level. </summary>
        /// <param name="exception">The exception.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Error(Exception exception, string message, params object[] args);

        /// <summary> Logs the specified message at the error level. </summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        /// <param name="context">Object to which the message applies.</param>
        void Error(Object context, string message, params object[] args);

        /// <summary> Logs the specified message at the error level. </summary>
        /// <param name="exception">The exception.</param>
        /// <param name="context">Object to which the message applies.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Error(Exception exception, Object context, string message, params object[] args);

        /// <summary>Logs the specified message at the warning level.</summary>
        /// <param name="message">The message.</param>
        void Warning(string message);

        /// <summary>Logs the specified message at the warning level.</summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Warning(string message, params object[] args);

        /// <summary> Logs the specified message at the warning level. </summary>
        /// <param name="exception">The exception.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Warning(Exception exception, string message, params object[] args);

        /// <summary> Logs the specified message at the warning level. </summary>
        /// <param name="context">Object to which the message applies.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Warning(Object context, string message, params object[] args);

        /// <summary> Logs the specified message at the warning level. </summary>
        /// <param name="exception">The exception.</param>
        /// <param name="context">Object to which the message applies.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Warning(Exception exception, Object context, string message, params object[] args);


        /// <summary>Logs the specified message at the info level.</summary>
        /// <param name="message">The message.</param>
        void Info(string message);

        /// <summary>Logs the specified message at the info level.</summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Info(string message, params object[] args);

        /// <summary> Logs the specified message at the info level. </summary>
        /// <param name="exception">The exception.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Info(Exception exception, string message, params object[] args);

        /// <summary> Logs the specified message at the info level. </summary>
        /// <param name="context">Object to which the message applies.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Info(Object context, string message, params object[] args);

        /// <summary> Logs the specified message at the info level. </summary>
        /// <param name="exception">The exception.</param>
        /// <param name="context">Object to which the message applies.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Info(Exception exception, Object context, string message, params object[] args);

        /// <summary>Logs the specified message at the debug level.</summary>
        /// <param name="message">The message.</param>
        void Debug(string message);

        /// <summary>Logs the specified message at the debug level.</summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Debug(string message, params object[] args);

        /// <summary> Logs the specified message at the debug level. </summary>
        /// <param name="exception">The exception.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Debug(Exception exception, string message, params object[] args);

        /// <summary> Logs the specified message at the debug level. </summary>
        /// <param name="context">Object to which the message applies.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Debug(Object context, string message, params object[] args);

        /// <summary> Logs the specified message at the debug level. </summary>
        /// <param name="exception">The exception.</param>
        /// <param name="context">Object to which the message applies.</param>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Debug(Exception exception, Object context, string message, params object[] args);
    }

    public enum LogLevel {
        Debug,
        Info,
        Warning,
        Error,
        None
    }
}